package test

import (
	"time"

	"go.mongodb.org/mongo-driver/v2/bson"
)

type UpdateWatch struct {
	ID                ID_               `json:"_id" bson:"_id"`
	OperationType     string            `json:"operationType" bson:"operationType"`
	ClusterTime       ClusterTime       `json:"clusterTime" bson:"clusterTime"`
	WallTime          time.Time         `json:"wallTime" bson:"wallTime"`
	Ns                Ns                `json:"ns" bson:"ns"`
	DocumentKey       DocumentKey       `json:"documentKey" bson:"documentKey"`
	UpdateDescription UpdateDescription `json:"updateDescription" bson:"updateDescription"`
}

type DeleteWatch struct {
	ID            ID_         `json:"_id" bson:"_id"`
	OperationType string      `json:"operationType" bson:"operationType"`
	ClusterTime   ClusterTime `json:"clusterTime" bson:"clusterTime"`
	WallTime      time.Time   `json:"wallTime" bson:"wallTime"`
	Ns            Ns          `json:"ns" bson:"ns"`
	DocumentKey   DocumentKey `json:"documentKey" bson:"documentKey"`
}

type InsertWatch struct {
	ID            ID_          `json:"_id" bson:"_id"`
	OperationType string       `json:"operationType" bson:"operationType"`
	ClusterTime   ClusterTime  `json:"clusterTime" bson:"clusterTime"`
	WallTime      time.Time    `json:"wallTime" bson:"wallTime"`
	Ns            Ns           `json:"ns" bson:"ns"`
	DocumentKey   DocumentKey  `json:"documentKey" bson:"documentKey"`
	FullDocument  FullDocument `json:"fullDocument" bson:"fullDocument"`
}

type WatchEvent struct {
	ID                ID_               `json:"_id" bson:"_id"`
	OperationType     string            `json:"operationType" bson:"operationType"`
	ClusterTime       ClusterTime       `json:"clusterTime" bson:"clusterTime"`
	WallTime          time.Time         `json:"wallTime" bson:"wallTime"`
	Ns                Ns                `json:"ns" bson:"ns"`
	DocumentKey       DocumentKey       `json:"documentKey" bson:"documentKey"`
	UpdateDescription UpdateDescription `json:"bson:updateDescription,omitempty" bson:"updateDescription,omitempty"`
	FullDocument      FullDocument      `json:"bson:fullDocument,omitempty" bson:"fullDocument,omitempty"`
}

type ID_ struct {
	Data string `json:"_data" bson:"_data"`
}

type ClusterTime = bson.Timestamp
type FullDocument = bson.M

type Ns struct {
	Db   string `json:"db" bson:"db"`
	Coll string `json:"coll" bson:"coll"`
}

type DocumentKey struct {
	ID bson.ObjectID `json:"_id" bson:"_id"`
}

type UpdateDescription struct {
	UpdatedFields   bson.M   `json:"updatedFields" bson:"updatedFields"`
	RemovedFields   []string `json:"removedFields" bson:"removedFields"`
	TruncatedArrays []string `json:"truncatedArrays" bson:"truncatedArrays"`
}
